iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0

前幾天在介紹 JWT 時,有提到跟 Session 相比 JWT 不用存在 DB 或 server,那 Session 的作用是什麼?
跟 JWT 相比什麼時候適合用 Session? 今天我們就來探討一下,它的運用~

What is Session

從翻譯來看 Session 可以是會話或會議,顧名思義,需要兩個人以上彼此交流,才能成為一個 Session,因此它會有開始和結束,我們可以把它當作是一段時間內所發生的狀態,其中有開始和結束。

在 HTTP 之中,他指的是儲存在伺服器端的使用者狀態,用途和 JWT 一樣,它可以用來記錄登入的狀態,讓使用者登入後,瀏覽其他網頁不會需要再登入一次。
常見的例子像是 ChatGPT 登入一段時間後,可能就會跳出登入階段已過期,要你重新登入,這就是一段 Session 的結束。

最初 Session 用法

Session 的機制會在使用者首次登入時,伺服器會為該使用者創建一個 Session,裡面儲存使用者的資料,並將這些資料存在 DB 或 memory,使用者之後瀏覽其他網頁時便會在 url 帶上 Session id,伺服器可以透過 Session id 來辨識使用者。

但這樣做等於把 session_id 給公開,且所有資訊都存在 server 端,會增加存放的成本,若今天是大型伺服器,經過負載平衡也不能確定 Session 是存在連到的那台的 DB,因此而衍生出了 Cookie。

Session with Cookie

Session 的機制會與 Cookie 配合使用。當使用者首次登入時,伺服器會為該使用者創建一個 Session,裡面儲存使用者的資料,並回傳一個儲存在 Cookie 的 Session UUID 給瀏覽器,使用者之後瀏覽其他網頁時,伺服器就會透過 Cookie 的 Session id 來辨識使用者。

Cookeie 可以隨著 HTTP request 一起發送到伺服器,因此也減少了暴露 Session id 的風險。
Session 也能透過存在 Cache 如: Redis,讓多 server 可以拿到 Session。

What is Cookie

一塊小餅乾,是一段由Server送給使用者瀏覽器的一小塊資料(文檔)。
瀏覽器會儲存它並且在瀏覽器下一次發送要求的時候將它送回原本送來的伺服器。

  • Cookie 特性
    • 儲存的資料量非常小:
      Cookie 只能儲存少量的資訊,通常每個 Cookie 的大小限制在 4KB 以內。
    • 儲存在客戶端:
      Cookie 儲存在用戶的瀏覽器中,而不是伺服器上。這意味著用戶的瀏覽器會自動在每次請求中攜帶相關的 Cookie。
    • 自動發送:
      當用戶訪問某個網站時,瀏覽器會自動將與該域名相關的 Cookie 包含在 HTTP 請求中發送給伺服器。
      過期時間:
    • 具有生命週期
      Cookie 可以設定過期時間。過期後,瀏覽器會自動刪除 Cookie。可以分為 Session Cookie(瀏覽器關閉後刪除)和持續性 Cookie(根據設定的到期時間刪除)。
      如果你在 chrome 中選擇刪除 cookie,你可能會像我一樣看到有幾千筆,你目前沒在使用的網頁留下的,這就是持續性的 Cookie。
      https://ithelp.ithome.com.tw/upload/images/20240920/20150927Q1lq3jjjKa.png
    • 只有特定的域名能存取:
      可以設定 Cookie 的 Domain 和 Path,來限制哪些網頁可以訪問這個 Cookie。
  • Cookie 缺點
    • 過小的資料儲存量:
      • 這是特性同時也是缺點,傳輸的量太大也會影響傳輸效率。
    • 安全性問題:
      • Cookie 的數據都存在瀏覽器,代表有辦法可以修改它的內容,偽造成別人。

過小的資料儲存量和安全性的,在搭配 Session 使用後,都會有效的緩解這些問題,但你可能會想配合 Session 就一定不會有安全性問題嗎? 這沒有 100 % 保證,因為可以透過竄改 Cookie 裡的 Session id,多次嘗試訪問其他用戶的 Session 信息,如果伺服器對 Session ID 的驗證不夠嚴格,竄改的 Cookie 就可能訪問到 Session id,導致未經授權的訪問。
這時候就出現可以防竄改的 SignedCookie。

SignedCookie

Signed Cookie 是一種加強版的 Cookie,它在標準 Cookie 的基礎上,加入了簽名機制,以提高安全性和防篡改能力。

其實運作方式也很簡單,就是伺服器將 Cookie 資訊回傳給瀏覽器時,在其中加入一段 secret ,並用 hash 加密,這樣攻擊者在竄改時就不知道 secret 是什麼,傳回來時也註定會錯誤。

JWT better than Session?

有人可能看過一些言論表示 JWT 比 Session 好用,但實際上還是要看時機來使用才是最好的:
e.g. :

  • 使用 JWT 使用者訊息儲存在 JWT 中,所有伺服器都可以獨立驗證和解碼 JWT,而不用集中儲存 Session 狀態,在驗證的速度會更快,且更具擴展性,在多台伺服器的情況下能有很好的效果。
  • Session 相對的安全性可能會在需要高安全性的應用程式中被採用。

這是一些例子,但實際上還需要看系統架構、使用場景和不同的需求應對,甚至也有兩者並用的情況。

Reference


上一篇
Day-5 | What is CORS !?
下一篇
Day-7 | RESTful 成熟度 & HATEOAS
系列文
埋藏在後端工程下的地雷與寶藏12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言